﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sisco.LogicaNegocio
{
    public class EquipoBLL
    {
        public List<AccesoDatos.EQUIPO> Listar()
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();

            return equipoDAO.Listar();
        }

        public List<AccesoDatos.EQUIPO> ListarEquipo(AccesoDatos.USUARIO usuario)
        {
            List<AccesoDatos.EQUIPO> lista = this.Listar();

            return lista.Where(x => (x.IDUSUARIO.HasValue ? x.IDUSUARIO.Value : 0) == usuario.ID && x.ELIMINADO == 0).ToList();
        }

        public List<AccesoDatos.EQUIPO> ListarEquipo(AccesoDatos.TIPOEQUIPO tipoEquipo)
        {
            List<AccesoDatos.EQUIPO> lista = this.Listar();

            return lista.Where(x => (x.IDTIPOEQUIPO.HasValue ? x.IDTIPOEQUIPO.Value : 0) == tipoEquipo.ID && x.ELIMINADO == 0).ToList();
        }

        public List<AccesoDatos.EQUIPO> ListarEquiposconProgramas(AccesoDatos.USUARIO usuario)
        {
            List<AccesoDatos.EQUIPO> lista = this.ListarEquipo(usuario);

            return lista.Where(x => x.TIPOEQUIPO1.PERMITEPROGRAMA == 1).ToList();
        }

        public List<AccesoDatos.EQUIPO> ListarEquiposxEstado(AccesoDatos.TIPOEQUIPO tipoEquipo, AccesoDatos.EQUIPO_ESTADO equipoEstado)
        {
            List<AccesoDatos.EQUIPO> lista = ListarEquipo(tipoEquipo);

            return lista.Where(x => (x.IDESTADO.HasValue ? x.IDESTADO.Value : 0) == equipoEstado.ID).ToList();
        }

        public List<AccesoDatos.EQUIPO> Buscar(string atributo, string valor)
        {
            List<AccesoDatos.EQUIPO> resultado = new List<AccesoDatos.EQUIPO>();

            if (!string.IsNullOrWhiteSpace(valor))
            {
                List<AccesoDatos.EQUIPO> lista = this.Listar();

                switch (atributo)
                {
                    case "TIPOEQUIPO":
                        resultado = lista.Where(x => (x.TIPOEQUIPO1 != null ? x.TIPOEQUIPO1.NOMBRETIPO : string.Empty).Equals(valor) && x.ELIMINADO == 0).ToList();
                        break;
                    case "MARCA":
                        resultado = lista.Where(x => x.MARCA.Equals(valor) && x.ELIMINADO == 0).ToList();
                        break;
                    case "MODELO":
                        resultado = lista.Where(x => x.MODELO.Equals(valor) && x.ELIMINADO == 0).ToList();
                        break;
                    case "SERIE":
                        resultado = lista.Where(x => x.SERIE.Equals(valor) && x.ELIMINADO == 0).ToList();
                        break;
                }
            }
            else
            {
                resultado = this.Listar();
            }

            return resultado;
        }

        public List<AccesoDatos.EQUIPO> BuscarEquipo(int idTipoEquipo, string marca, string serie)        
        {
            List<AccesoDatos.EQUIPO> resultado;            
            List<AccesoDatos.EQUIPO> lista = this.Listar();

            resultado = lista.Where(x => (x.IDTIPOEQUIPO.HasValue ? x.IDTIPOEQUIPO.Value : 0).Equals(idTipoEquipo) && x.MARCA.Equals(marca,StringComparison.CurrentCultureIgnoreCase) && x.SERIE.Equals(serie,StringComparison.CurrentCultureIgnoreCase) && x.ELIMINADO == 0).ToList();

            return resultado;
        }

        public int Registrar(AccesoDatos.EQUIPO nuevoEquipo, AccesoDatos.USUARIO usuarioSistema)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();
            LogicaNegocio.TipoMotivoBLL tipoMotivoBLL = new TipoMotivoBLL();
            AccesoDatos.TIPOMOTIVO tipoMotivo = tipoMotivoBLL.GetTipoMotivo("MI", "Primer ingreso a almacén");

            AccesoDatos.MOVIMIENTO nuevoMovimiento =
                new AccesoDatos.MOVIMIENTO()
                {
                    IDTIPOMOTIVO = tipoMotivo != null ? tipoMotivo.ID : 0,
                    FECHAREGISTRO = DateTime.Now,
                    ELIMINADO = 0,
                    IDUSUARIORESPONSABLE = usuarioSistema.ID,
                    NOMBREUSUARIORESPONSABLE = usuarioSistema.NOMBRECOMPLETO,
                    REGISTRADOPOR = usuarioSistema.NOMBRECOMPLETO,
                    OBSERVACION = string.Format("Registro de equipo")
                };

            return equipoDAO.Registrar(nuevoEquipo, nuevoMovimiento);
        }

        public List<AccesoDatos.EQUIPO> ListarEquiposDisponibles(AccesoDatos.TIPOEQUIPO selectedTipoEquipo)
        {
            List<AccesoDatos.EQUIPO> lista = this.Listar();

            return lista.Where(x => (x.TIPOEQUIPO1 != null ? x.TIPOEQUIPO1.NOMBRETIPO : string.Empty).Equals(selectedTipoEquipo.NOMBRETIPO) && x.ASIGNADO == 0 && x.ELIMINADO == 0).ToList();
        }

        public int AsignarEquipos(int idUsuario, List<AccesoDatos.EQUIPO> updateEquipos , AccesoDatos.USUARIO usuarioSistema)
        {
            int resultado = 0;
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();

            LogicaNegocio.EstadoEquipoBLL estadoEquipoBLL;
            LogicaNegocio.TipoMotivoBLL tipoMotivoBLL;
            LogicaNegocio.UsuarioBLL usuarioBLL;

            foreach (AccesoDatos.EQUIPO equipo in updateEquipos)
            {
                tipoMotivoBLL = new TipoMotivoBLL();
                usuarioBLL = new UsuarioBLL();
                estadoEquipoBLL = new EstadoEquipoBLL();

                AccesoDatos.TIPOMOTIVO tipoMotivo = tipoMotivoBLL.GetTipoMotivo("MF", "Asignación del equipo");
                AccesoDatos.USUARIO usuario = usuarioBLL.GetUsuario(idUsuario);
                AccesoDatos.EQUIPO_ESTADO equipoEstado = estadoEquipoBLL.GetEstadoEquipo("Asignado");

                AccesoDatos.MOVIMIENTO nuevoMovimiento = new AccesoDatos.MOVIMIENTO()
                {
                    IDTIPOMOTIVO = tipoMotivo != null ? tipoMotivo.ID : 0,
                    FECHAREGISTRO = DateTime.Now,
                    ELIMINADO = 0,
                    IDUSUARIORESPONSABLE = usuarioSistema.ID,
                    NOMBREUSUARIORESPONSABLE = usuarioSistema.NOMBRECOMPLETO,
                    REGISTRADOPOR = usuarioSistema.NOMBRECOMPLETO,
                    OBSERVACION = string.Format("Asignación de equipo. Se asigna a usuario: {0}", (usuario.NOMBRECOMPLETO != null ? usuario.NOMBRECOMPLETO.Trim() : string.Empty))
                };
                
                resultado = resultado + equipoDAO.AsignarEquipo(idUsuario, equipo, equipoEstado, nuevoMovimiento,usuarioSistema);
            }

            return resultado;
        }

        public object BuscarEquipo(string valMarca, string valModelo, string valSerie, int? valIdTipoEquipo, DateTime? valFechaRegistroDesde, DateTime? valFechaRegistroHasta, int? valEstado)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();
            return equipoDAO.BuscarEquipo(valMarca, valModelo, valSerie, valIdTipoEquipo, valFechaRegistroDesde, valFechaRegistroHasta, valEstado);
        }

        public System.Data.DataTable Rep_ListarEquipo(string marca, string modelo, string serie, int? tipoEquipo, int? estadoEquipo)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();
            return equipoDAO.USP_ListarEquipo(marca, modelo, serie, tipoEquipo, estadoEquipo);
        }

        public int Modificar(AccesoDatos.EQUIPO selectedEquipo, AccesoDatos.EQUIPO updEquipo)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();
            return equipoDAO.Modificar(selectedEquipo, updEquipo);
        }

        public int LiberarEquipo(AccesoDatos.EQUIPO selectedEquipo, AccesoDatos.USUARIO usuarioSistema)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();

            LogicaNegocio.TipoMotivoBLL tipoMotivoBLL = new TipoMotivoBLL();
            LogicaNegocio.UsuarioBLL usuarioBLL = new UsuarioBLL();
            LogicaNegocio.EstadoEquipoBLL estadoEquipoBLL = new EstadoEquipoBLL();

            AccesoDatos.EQUIPO updEquipo = new AccesoDatos.EQUIPO()
            {
                IDESTADO = estadoEquipoBLL.GetEstadoEquipo("Liberado").ID
            };

            AccesoDatos.TIPOMOTIVO tipoMotivo = tipoMotivoBLL.GetTipoMotivo("ME", "Liberación del equipo");   //ME: Movimiento Externo
            AccesoDatos.USUARIO usuario = selectedEquipo.IDUSUARIO.HasValue ? usuarioBLL.GetUsuario(selectedEquipo.IDUSUARIO.Value) : new AccesoDatos.USUARIO();

            AccesoDatos.MOVIMIENTO nuevoMovimiento =
                new AccesoDatos.MOVIMIENTO()
                {
                    IDTIPOMOTIVO = tipoMotivo != null ? tipoMotivo.ID : 0,
                    FECHAREGISTRO = DateTime.Now,
                    ELIMINADO = 0,
                    IDUSUARIORESPONSABLE = usuarioSistema.ID,
                    NOMBREUSUARIORESPONSABLE = usuarioSistema.NOMBRECOMPLETO,
                    REGISTRADOPOR = usuarioSistema.NOMBRECOMPLETO,
                    OBSERVACION = string.Format("Liberación de equipo. Pertenecía a usuario: {0}", (usuario.NOMBRECOMPLETO != null ? usuario.NOMBRECOMPLETO.Trim() : string.Empty))
                };
            
            return equipoDAO.Liberar(selectedEquipo, updEquipo, nuevoMovimiento, usuarioSistema);
        }

        public int DarBajaEquipo(AccesoDatos.EQUIPO selectedEquipo, AccesoDatos.USUARIO usuarioSistema)
        {
            AccesoDatos.EquipoDAO equipoDAO = new AccesoDatos.EquipoDAO();

            LogicaNegocio.TipoMotivoBLL tipoMotivoBLL = new TipoMotivoBLL();
            LogicaNegocio.UsuarioBLL usuarioBLL = new UsuarioBLL();
            LogicaNegocio.EstadoEquipoBLL estadoEquipoBLL = new EstadoEquipoBLL();

            AccesoDatos.EQUIPO updEquipo = new AccesoDatos.EQUIPO()
            {
                IDESTADO = estadoEquipoBLL.GetEstadoEquipo("Dado de Baja").ID
            };

            AccesoDatos.TIPOMOTIVO tipoMotivo = tipoMotivoBLL.GetTipoMotivo("ME", "Dado de Baja equipo");
            AccesoDatos.USUARIO usuario = selectedEquipo.IDUSUARIO.HasValue ? usuarioBLL.GetUsuario(selectedEquipo.IDUSUARIO.Value) : new AccesoDatos.USUARIO();
            
            AccesoDatos.MOVIMIENTO nuevoMovimiento =
                new AccesoDatos.MOVIMIENTO()
                {
                    IDTIPOMOTIVO = tipoMotivo != null ? tipoMotivo.ID : 0,
                    FECHAREGISTRO = DateTime.Now,
                    ELIMINADO = 0,
                    IDUSUARIORESPONSABLE = usuarioSistema.ID,
                    NOMBREUSUARIORESPONSABLE = usuarioSistema.NOMBRECOMPLETO,
                    REGISTRADOPOR = usuarioSistema.NOMBRECOMPLETO,
                    OBSERVACION = string.Format("Dado de baja a equipo")
                };

            return equipoDAO.DarBajaEquipo(selectedEquipo, updEquipo, nuevoMovimiento, usuarioSistema);
        }
    }
}
